今天開始介紹第二種觸發條件:指令。
在 Discord,互動 (interaction) 是一個重要的特色,甚至文件中有特別把互動做一個整理。互動一共有三種:
不過,在這個系列的文章,我傾向把「指令」歸類到「觸發條件」中,「訊息元件」與「互動視窗」則是歸類到「執行內容」。
今天會先介紹其中一種指令:slash command。
有的地方翻做「命令」,就連 Discord 的 Developer Help Center 的翻譯也沒有統一...
指令只是一個簡稱,完整一點應該稱呼為「應用指令 (Application Commands)」,它可以讓使用者用很簡單、直觀的方式對 Discord BOT 下達要求。
指令一共有三種:
不過,其實現在應該有四種,在 2024-08-26 公告了第四種指令:Entry Point command,與 Discord 的活動 (Activity) 有關,但這系列就不介紹了
Entry Point command 超級新,新到連 Discord 官方文件內文還是寫三種 (儘管下面列了四種 XD)
如上面所述,斜線指令的使用方式非常簡單,只要在輸入框輸入一個斜線 (/
) 就可以看到一個指令選單,接下來只要點擊選擇想要使用的功能就好。當然,如果記得指令的話,也可以直接輸入完整指令。
在開發斜線指令之前,要先取得伺服器 ID (guild ID),這邊提供兩種簡單的取得方法。
伺服器 ID 可以直接從 Discord 拿到,但需要開啟開發者模式。而開啟的方法如下:
點擊左下方自己的名稱旁的齒輪按鈕,開啟使用者設定。
進入進階分頁
開啟開發者模式
接下來,回到伺服器,對著伺服器名稱按滑鼠右鍵,就會出現一個選單,點擊「複製伺服器 ID」即可。
這個方法也很簡單,讓程式取得並印出來就好。只要把之前的 Quickstart 程式調整一下就好:
@client.event
async def on_ready():
print("guilds", client.guilds[0].id)
權限的部分其實已經有了,只是想要給大家確認一下~
在加入伺服器的時候 (Day 02),其實就有特別列出請求授予 Discord BOT 「應用指令」的權限:
另外,之前在查看 Discord BOT 權限時 (Day 05),有一個權限清單,裡面也有列到「使用應用程式命令」:
先使用這個範例 (簡化自 Github 上的範例)
# day07.py
import discord
from discord import app_commands
GUILD_ID = "your guild ID"
MY_GUILD = discord.Object(id=GUILD_ID)
class MyClient(discord.Client):
def __init__(self, *, intents: discord.Intents):
super().__init__(intents=intents)
self.tree = app_commands.CommandTree(self)
async def setup_hook(self):
self.tree.copy_global_to(guild=MY_GUILD)
await self.tree.sync(guild=MY_GUILD)
intents = discord.Intents.default()
client = MyClient(intents=intents)
@client.event
async def on_ready():
print(f'Logged in as {client.user} (ID: {client.user.id})')
@client.tree.command()
async def hello(interaction: discord.Interaction):
"""Says hello!"""
await interaction.response.send_message(f'Hi, {interaction.user.mention}')
client.run('token')
執行之後,來測試一下結果。
在對話框輸入一個斜線 (/
),可以看到多了一個 /hello
。
/hello
下方有一個小小的說明:Says hello!
,右邊顯示這是來自我們的 Discord BOT 的斜線指令。
左鍵點選後,就會帶入完整指令 /hello
。
按下 Enter 送出訊息之後,就可以看到
畫面中會顯示哪位成員使用了哪個指令,並且成功觸發我們寫好的功能:Tag 成員。
最後,來了解一下範例程式的內容。以下會挑幾個片段進行說明:
建立自己的 Client Class
class MyClient(discord.Client):
def __init__(self, *, intents: discord.Intents):
super().__init__(intents=intents)
self.tree = app_commands.CommandTree(self)
async def setup_hook(self):
self.tree.copy_global_to(guild=MY_GUILD)
await self.tree.sync(guild=MY_GUILD)
setup_hook
CommandTree
是 application command 的容器,要先建立一個容器來乘載自訂的斜線指令
self.tree = app_commands.CommandTree(self)
setup_hook
中,把後面的斜線指令同步到指定的伺服器內 (不指定的話,註冊斜線指令要等很久)斜線指令
@client.tree.command()
async def hello(interaction: discord.Interaction):
"""Says hello!"""
await interaction.response.send_message(f'Hi, {interaction.user.mention}')
hello
,所以觸發的指令就是 /hello
,而下方的註解 (Says hello!
) 就會成為指令說明。礙於時間篇幅,今天就先介紹到這邊了,還有一些 slash command 更進階的用法還沒介紹,預計等到所有應用指令都介紹完,再回頭一起介紹。
今天我們介紹了斜線指令 (slash command),明天會繼續介紹其他應用指令~
目前也正在學習怎麼製作 discordbot,謝謝作者的教學
不會~ 大家可以互相交流,一起學習XD
稍早有看到有提問,但因為要趕稿,現在才有辦法回應,看起來問題已經解決了?
對,因為看到您後面文章有說明解答我的困惑了,起初我看網路上其他教學都用 commands.Bot,但官方文件 API reference 一開始是出現的是 discord.Client 會有點困惑。
https://ithelp.ithome.com.tw/articles/10357208
https://discordpy.readthedocs.io/en/latest/ext/commands/api.html#bots